package com.jr.controller;

import com.jr.pojo.ProjectInfo; // 导入项目信息实体类
import com.jr.service.IProjectInfoService; // 导入项目信息服务接口
import com.jr.service.impl.ProjectInfoServiceImpl; // 导入服务实现类

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet; // Servlet注解
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; // HTTP请求对象
import javax.servlet.http.HttpServletResponse; // HTTP响应对象
import javax.servlet.http.HttpSession; // HTTP会话对象
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; // 反射相关类
import java.util.ArrayList; // 集合类

@WebServlet("/projectInfo/*") // 定义Servlet映射路径
public class ProjectInfoController extends HttpServlet {

    private IProjectInfoService ips = new ProjectInfoServiceImpl(); // 初始化服务实例

    /**
     * 核心路由处理方法
     * 通过反射机制动态调用对应业务方法
     */
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String requestURI = request.getRequestURI(); // 获取请求URI
    //    System.out.println("requestURI是："+requestURI);
//        requestURI是：/asd/用户什么都不输入
        // 根据申报状态查询 requestURI是：/asd/projectInfo/query
        // 已申报中点击操作审核时：requestURI是：/asd/projectInfo/queryByPid
//    申报返回是     requestURI是：/asd/projectInfo/showdt 返回后回到shoedt方法
        //申报选择审核是requestURI是：/asd/projectInfo/updatePro 选择审核也就是修改
        int index = requestURI.lastIndexOf("/") + 1; // 定位最后一个斜杠位置
        String mName = requestURI.substring(index); // 提取方法名

        if (mName.length() == 0) { // 如果方法名为空 也就是说只有/asd/
            mName = "showdt"; // 默认使用showdt方法
        }

        Class<ProjectInfoController> cla = ProjectInfoController.class; // 获取当前类
        Method method = null;

        try {
            method = cla.getMethod(mName, HttpServletRequest.class, HttpServletResponse.class); // 通过反射获取方法

            // 设置响应编码
            response.setContentType("text/html;charset=utf-8");
            request.setCharacterEncoding("utf-8");

            // 调用对应方法
            method.invoke(this, request, response);
        } catch (NoSuchMethodException e) { // 方法不存在异常
            e.printStackTrace();
        } catch (IllegalAccessException e) { // 非法访问异常
            e.printStackTrace();
        } catch (InvocationTargetException e) { // 调用目标异常
            e.printStackTrace();
        }
    }

    /**
     * 展示所有项目数据
     */
    public void showdt(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 查询所有项目(-1表示全部状态)
        ArrayList<ProjectInfo> projectInfos = ips.queryByStatus(-1);

        HttpSession session = request.getSession(); // 获取会话对象
        // 将项目列表存入会话 session作用域在浏览器关闭时才结束
        session.setAttribute("list", projectInfos);

        // 转发到首页
        request.getRequestDispatcher("/index.jsp").forward(request, response);
    }

    /**
     * 条件查询项目数据
     */
    public void query(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取状态参数
        String status = request.getParameter("status");
        // 转换为整型
        int prostatus = Integer.parseInt(status);

//        根据字段查询项目，把查询结果的集合导入session.getAttribute()中的key,导入后转发跳转页面
        // 根据状态查询项目
        ArrayList<ProjectInfo> projectInfos = ips.queryByStatus(prostatus);

        HttpSession session = request.getSession();
        // 将查询结果存入会话
        session.setAttribute("list", projectInfos);

        // 转发到首页显示结果
        request.getRequestDispatcher("/index.jsp").forward(request, response);
    }

    /**
     * 按项目ID精确查询
     */
    public void queryByPid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//        String pid = request.getParameter("pid");
        // 获取项目ID参数
        int pid = Integer.parseInt(request.getParameter("pid"));//现在的id是
        // 根据ID查询项目
        ProjectInfo projectInfo = ips.queryByPid(pid);

        // 将项目对象存入会话
        request.getSession().setAttribute("pro", projectInfo);

        // 重定向到更新页面
        response.sendRedirect("/asd/updatePro.jsp");
    }

    /**
     * 更新项目状态
     */
    public void updatePro(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取状态参数
        int status = Integer.parseInt(request.getParameter("status"));
        // 获取项目ID参数
        int pid = Integer.parseInt(request.getParameter("pid"));

        // 创建项目对象
        ProjectInfo pro = new ProjectInfo();
        pro.setPid(pid);
        pro.setStatus(status);

        // 更新项目状态
        boolean b = ips.updateProject(pro);

        HttpSession session = request.getSession();
        // 设置更新结果消息
        session.setAttribute("mess", b ? "审核成功！" : "审核失败！");

        // 重新查询所有项目
        ArrayList<ProjectInfo> projectInfos = ips.queryByStatus(-1);
        session.setAttribute("list", projectInfos);

        // 重定向到首页
        response.sendRedirect("/asd/index.jsp");
    }
}
